#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author: zhipeng time: 2018/10/11

import xlrd
import xlwt
from ctypes import *

import tkinter as tk
from tkinter import filedialog


def group(sheet, L_index, K_index):
    grouping = cdll.LoadLibrary("./Dll_test.dll")
    # 功能：获取长度L和渗透率K的那一列数据，在Python中定义一个数组
    # 将每一列数据分别给对应的数组，将数组传给C++，至于在Python中定义数组可以参考“https://zhuanlan.zhihu.com/p/20152309”第四条
    # 实测在Python中定义的数组可以大到1亿个，应该是可以满足需求的

    count = len(sheet.col_values(L_index))-1
    # 开始定义数组
    type_double_array = c_double * count
    L_array = type_double_array()
    K_array = type_double_array()
    group_L = type_double_array()
    group_K = type_double_array()

    # 给数组赋值
    for i, temp in enumerate(sheet.col_values(L_index)[1:]):
        L_array[i] = temp
    for i, temp in enumerate(sheet.col_values(K_index)[1:]):
        K_array[i] = temp
    # 将数组传给C++
    grouping.accept_args(count, L_array, K_array, group_L, group_K)

    return group_L, group_K


def data_process(group_L, group_K):
    # 功能：接受两个数组参数，定义列表将数组的值转到列表中
    # 最终的数据结构是：[{"序号":[所有的序号]}, {"长度L":[合并后的L列表]}, {"渗透率K":[合并后的K列表]} ]，
    # 这样的数据结构好处是： 列表中的每一个字典都是Excel中的一列值，写入Excel的时候更加方便
    count = len(sheet.col_values(L_index)) - 1
    L_list = []
    K_list = []
    num_list = []

    for i in range(count):
        if group_L[i] == 0:
            break
        L_list.append(group_L[i])
        K_list.append(group_K[i])
        num_list.append(i + 1)

    num_dic = {}
    L_dic = {}
    K_dic = {}

    num_dic["序号"] = num_list
    L_dic["长度L"] = L_list
    K_dic["渗透率K"] = K_list

    sum_list = []
    sum_list.append(num_dic)
    sum_list.append(L_dic)
    sum_list.append(K_dic)

    return sum_list


def write_excel(sum_list, file, count):
    # 实现多表单命名
    sheet = file.add_sheet("sheet" + str(count), cell_overwrite_ok=True)
    # 首先遍历列表，获取列数和字典，再遍历字典的键和值，再写入
    for col, dic in enumerate(sum_list):

        for item in dic.items():
            sheet.write(0, col, item[0])
            # 相当于写表头
            for i, temp in enumerate(item[1]):
                sheet.write(i+1, col, temp)
    file.save('result.xls')


if __name__ == "__main__":
    L_index = ""
    K_index = ""

    # 通过对话框的方式获取文件路径
    root = tk.Tk()
    root.withdraw()
    file_path = filedialog.askopenfilename()

    work_book = xlrd.open_workbook(file_path)
    sheetNames = work_book.sheet_names()
    file = xlwt.Workbook()
    # 通过表名找到表，进行多表单处理
    for i, name in enumerate(sheetNames):
        sheet = work_book.sheet_by_name(name)
        # 查找表头是否含有我们要处理的参数，
        # 如果有，将它存入变量中，可以当做下一个函数的参数，这样就实现了“长度L”“渗透率K”在Excel中位置不固定也能处理
        # 如果没有就跳过该表进入下一个表单
        for index in range(len(sheet.row_values(0))):
            if sheet.row_values(0)[index] == "长度L":
                L_index = index
            if sheet.row_values(0)[index] == "渗透率K":
                K_index = index

        if K_index == "" or L_index == "":
            continue

        group_L, group_K = group(sheet, L_index, K_index)
        sum_list = data_process(group_L, group_K)
        write_excel(sum_list, file, i+1)

        L_index = K_index = ""



